import requests
import pandas as pd
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文和负号支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# 网址
url = 'https://www.cnur.com/major/1610.html'

# 伪装访问头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

# 发送请求
response = requests.get(url, headers=headers)

# 确保请求成功
if response.status_code == 200:
    # 使用BeautifulSoup解析HTML内容
    soup = BeautifulSoup(response.text, 'html.parser')

    # 找到表格数据
    table = soup.find('table')

    # 读取表格数据到DataFrame
    df = pd.read_html(str(table))[0]

    # 打印表格信息
    print(df)

    # 保存DataFrame到CSV
    df.to_csv('2024年食品卫生与营养学专业大学排名及评级结果.csv', index=False, encoding='utf-8-sig')
    print("文件已保存。")
else:
    print("网页请求失败，状态码：", response.status_code)


# 加载数据
data = pd.read_csv('2024年食品卫生与营养学专业大学排名及评级结果.csv')
# 1. 重新设置列名（如果需要）并删除不必要的第一行
data.columns = ['评级', '排名', '高校名称', '省份', '参考排名', '总分']
data = data.drop(0)
# 2. 计算不同评级的大学数量
rating_counts = data['评级'].value_counts()
# 3. 处理缺失值
data['评级'] = data['评级'].fillna('未知')
# 4. 处理错误数据
# 假设“总分”应该是数值类型，错误的输入我们将其转换为NaN
data['总分'] = pd.to_numeric(data['总分'], errors='coerce')
# 5. 特征提取
# 提取参考排名中的百分比数值
data['参考排名百分比'] = data['参考排名'].str.extract('前(\d+)%').astype(float)
# 打印处理后的数据和统计结果
print(data.head())
print("\n不同评级的大学数量:\n", rating_counts)
data.to_csv('处理后的数据.csv', index=False, encoding='utf-8-sig')



# 加载数据
data = pd.read_csv('处理后的数据.csv')
# 1. 不同评级的大学数量统计
plt.figure(figsize=(10, 6))
sns.countplot(x='评级', data=data, order=sorted(data['评级'].unique()))
plt.title('不同评级的大学数量')
plt.xlabel('评级')
plt.ylabel('数量')
plt.savefig('不同评级的大学数量.png')
plt.show()

# 2. 按省份统计大学数量
plt.figure(figsize=(12, 6))
sns.countplot(x='省份', data=data, order=data['省份'].value_counts().index)
plt.title('按省份统计的大学数量')
plt.xlabel('省份')
plt.ylabel('数量')
plt.savefig('按省份统计的大学数量.png')
plt.show()

# 3. 高校总分分布
plt.figure(figsize=(10, 6))
sns.histplot(data['总分'], bins=10, kde=True)
plt.title('高校总分分布')
plt.xlabel('总分')
plt.ylabel('频率')
plt.savefig('高校总分分布.png')
plt.show()

# 4. 各省份平均总分
plt.figure(figsize=(12, 6))
province_scores = data.groupby('省份')['总分'].mean().sort_values()
sns.barplot(x=province_scores.index, y=province_scores)
plt.title('各省份平均总分')
plt.xlabel('省份')
plt.ylabel('平均总分')
plt.xticks(rotation=45)
plt.savefig('各省份平均总分.png')
plt.show()

# 5. 参考排名与总分的关系
plt.figure(figsize=(10, 6))
sns.scatterplot(x='参考排名百分比', y='总分', data=data)
plt.title('参考排名百分比与总分的关系')
plt.xlabel('参考排名百分比')
plt.ylabel('总分')
plt.savefig('参考排名与总分的关系.png')
plt.show()


